home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / udev / migrate-fstab-to-uuid.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2008-10-24  |  3KB  |  150 lines

  1. #!/bin/sh -e
  2. # Rewrite /etc/fstab so that filesystems are mounted by UUID
  3.  
  4. if [ -e /etc/fstab.pre-uuid ]; then
  5.     echo "/etc/fstab.pre-uuid already exists" 1>&2
  6.     echo "remove this file before running the script again" 1>&2
  7.     exit 1
  8. fi
  9.  
  10. cp -a /etc/fstab /etc/fstab.pre-uuid
  11. exec 9<&0 8>&1 </etc/fstab >/etc/fstab.new
  12. trap "rm -f /etc/fstab.new" 0
  13.  
  14. uuids=""
  15.  
  16. old_IFS="$IFS"
  17. IFS="
  18. "
  19. while read LINE
  20. do
  21.     IFS="$old_IFS"
  22.     set -- $LINE
  23.     IFS="
  24. "
  25.     DEV=$1 MTPT=$2 FSTYPE=$3 OPTS=$4
  26.  
  27.     # Check the device is sane for conversion
  28.     case "$DEV" in
  29.     ""|\#*)        # Preserve blank lines and user comments
  30.         echo "$LINE"
  31.         continue
  32.         ;;
  33.     LABEL=*|UUID=*)    # Already mounting by LABEL or UUID
  34.         echo "$LINE"
  35.         continue
  36.         ;;
  37.     /dev/mapper/*_crypt)# DM-Crypt devices
  38.         echo "$LINE"
  39.         continue
  40.         ;;
  41.     /dev/disk/*)    # Already mounting by particulars
  42.         echo "$LINE"
  43.         continue
  44.         ;;
  45.     /dev/fd[0-9]*)    # Floppy devices, not mounted by filesystem
  46.         echo "$LINE"
  47.         continue
  48.         ;;
  49.     /dev/*)        # Ordinary devices -- we want to convert
  50.         if [ ! -b "$DEV" ]; then
  51.         echo "$LINE"
  52.         continue
  53.         fi
  54.         ;;
  55.     *)            # Anything else gets left alone
  56.         echo "$LINE"
  57.         continue
  58.         ;;
  59.     esac 
  60.     
  61.     # Don't convert filesystem types that don't make sense
  62.     case "$FSTYPE" in
  63.     auto)        # Auto detection -- implies non-fixed fs
  64.         echo "$LINE"
  65.         continue
  66.         ;;
  67.     esac
  68.     
  69.     # Check filesystem options also
  70.     case "$OPTS" in
  71.     noauto|*,noauto|noauto,*|*,noauto,*)    # Implies non-fixed
  72.         echo "$LINE"
  73.         continue
  74.         ;;
  75.     esac
  76.  
  77.  
  78.     # If we reach this point, we think we want to move the fstab
  79.     # entry over to mount-by-UUID.  The first check is that the
  80.     # filesystem on the device *has* a uuid
  81.     UUID=$(/sbin/vol_id -u "$DEV" || true)
  82.     if [ -z "$UUID" ]; then
  83.     # Can we generate one?
  84.     if [ "$FSTYPE" = "swap" ]; then
  85.         REAL_FSTYPE=$(/sbin/vol_id -t "$DEV" || true)
  86.         case "$REAL_FSTYPE" in
  87.         swap)    # is a swap device, add a UUID to it
  88.             UUID=$(uuidgen)
  89.             echo -n "$UUID" |
  90.               perl -ne 's/-//g;chomp;print pack "H*",$_' |
  91.               dd conv=notrunc "of=$DEV" obs=1 seek=1036 2>/dev/null
  92.             ;;
  93.         swsusp)    # contains a suspended image, mkswap it!
  94.             if ! mkswap "$DEV" >/dev/null; then
  95.             echo "Warning: unable to make swap $DEV" 1>&2
  96.             echo "$LINE"
  97.             continue
  98.             fi
  99.  
  100.             UUID=$(/sbin/vol_id -u "$DEV" || true)
  101.             if [ -z "$UUID" ]; then
  102.             echo "Warning: unable to generate uuid for $DEV" 1>&2
  103.             echo "$LINE"
  104.             continue
  105.             fi
  106.             ;;
  107.         *)
  108.             echo "Warning: $DEV is not a swap partition" 1>&2
  109.             echo "$LINE"
  110.             continue
  111.             ;;
  112.         esac
  113.     else
  114.         echo "Warning: unable to find a UUID for $DEV" 1>&2
  115.         echo "$LINE"
  116.         continue
  117.     fi
  118.     fi
  119.  
  120.     # Check for duplicates
  121.     case "$uuids" in
  122.     "$UUID" | "$UUID "* | *" $UUID" | *" $UUID "*)
  123.     echo "Error: duplicate UUID $UUID detected" 1>&2
  124.     echo "Unable to migrate /etc/fstab to UUID-based mounting" 1>&2
  125.  
  126.     exec 0<&9 9<&- 1>&8 8>&-
  127.     trap 0
  128.  
  129.     rm -f /etc/fstab.new
  130.     exit 1
  131.     ;;
  132.     *)
  133.     uuids="${uuids:+$uuids }$UUID"
  134.     ;;
  135.     esac
  136.  
  137.     # Now write the new line out
  138.     shift
  139.     echo "# $DEV -- converted during upgrade to edgy"
  140.     echo "UUID=$UUID $@"
  141. done
  142. IFS="$old_IFS"
  143.  
  144. exec 0<&9 9<&- 1>&8 8>&-
  145. trap 0
  146.  
  147. mv -f /etc/fstab.new /etc/fstab
  148.  
  149. exit 0
  150.